package com.nageoffer.jobtrain.projects.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nageoffer.jobtrain.projects.dao.entity.ContestDO;
import com.nageoffer.jobtrain.projects.dto.req.*;
import com.nageoffer.jobtrain.projects.dto.resp.*;
import com.nageoffer.jobtrain.projects.service.handler.remind.dto.ContestRemindDTO;

/**
 * 竞赛管理接口层
 * author：唐晨
 */
public interface ContestService extends IService<ContestDO> {
    /**
     * 竞赛分页查询
     *
     * @param requestParam 分页查询请求参数
     * @return 竞赛分页返回列表
     */
    IPage<ContestPageRespDTO> contestPageList(ContestPageReqDTO requestParam);

    /**
     * 竞赛预约提醒
     *
     * @param requestParam 竞赛预约提醒请求入参
     */
    void createRemindContest(ContestCreateRemindReqDTO requestParam);

    /**
     * 竞赛预约取消提醒
     *
     * @param requestParam 竞赛预约取消提醒入参
     */
    void cancelRemindContest(ContestRemindCancelReqDTO requestParam);

    /**
     * 验证用户是否已经取消竞赛该时间点预约提醒
     *
     * @param contestRemindDTO 消息队列预约提醒请求入参
     */
    boolean isCancelRemind(ContestRemindDTO contestRemindDTO);

    /**
     * 用户查看自己某个竞赛预约详情
     *
     * @param requestParam 查看某个竞赛请求入参
     * @return 竞赛预约详情返回实体
     */
    ContestRemindQueryRespDTO someRemindContest(SomeRemindContestReqDTO requestParam);

    /**
     * 查询竞赛中第一道OJ题目ID
     *
     * @param id 当前竞赛ID
     * @return 竞赛中第一道OJ题目ID返回实体
     */
    ContestFirstQuestionRespDTO firstQuestionContest(Long id);

    /**
     * 查询竞赛中上一道OJ题目ID
     *
     * @param requestParam 查询竞赛中上一道OJ题目请求入参
     * @return 上一道OJ题目返回实体
     */
    ContestPrevQuestionRespDTO prevQuestionContest(ContestPrevQuestionReqDTO requestParam);

    /**
     * 查询竞赛中下一道OJ题目ID
     *
     * @param requestParam 查询竞赛中下一道OJ题目请求入参
     * @return 下一道OJ题目返回实体
     */
    ContestNextQuestionRespDTO nextQuestionContest(ContestNextQuestionReqDTO requestParam);
}